home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / emacs / emacs1857 / bin_d2.zoo / lisp / hideif.el < prev    next >
Lisp/Scheme  |  1991-12-02  |  32KB  |  1,042 lines

  1. ;;; hide-ifdef-mode.el   Hides selected code within ifdef.
  2. ;;;
  3. ;;; Copyright (C) 1988 Brian Marick and Daniel LaLiberte
  4. ;;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL.
  5. ;;; Extensively modified by Daniel LaLiberte (while at Gould).
  6. ;;;
  7. ;;; You may freely modify and distribute this, but keep a record
  8. ;;; of modifications and send comments to:
  9. ;;;      liberte@a.cs.uiuc.edu  or  ihnp4!uiucdcs!liberte
  10. ;;; I will continue to upgrade hide-ifdef-mode
  11. ;;; with your contributions and will eventually offer it to FSF.
  12. ;;;
  13. ;;; $Header: hide-ifdef-mode.el,v 1.7 88/02/16 03:12:58 liberte Exp $
  14. ;;;
  15. ;;; $Log:    hide-ifdef-mode.el,v $
  16. ;;; Revision 1.7  88/02/16  03:12:58  liberte
  17. ;;; Fixed comments and doc strings.
  18. ;;; Added optional prefix arg for ifdef motion commands.
  19. ;;; 
  20. ;;; Revision 1.6  88/02/05  00:36:18  liberte
  21. ;;; Bug fixes.
  22. ;;; 1. A multi-line comment that starts on an #ifdef line
  23. ;;;    now ends on that line.
  24. ;;; 2. Fix bad function name: hide-hif-ifdef-toggle-read-only
  25. ;;; 3. Make ifdef-block hiding work outside of ifdefs.
  26. ;;; 
  27. ;;; Revision 1.5  88/01/31  23:19:31  liberte
  28. ;;; Major clean up.
  29. ;;;   Prefix internal names with "hif-".
  30. ;;; 
  31. ;;; Revision 1.4  88/01/30  14:09:38  liberte
  32. ;;; Add hide-ifdef-hiding and hide-ifdef-mode to minor-mode-alist.
  33. ;;; 
  34. ;;; Revision 1.3  88/01/29  00:38:19  liberte
  35. ;;; Fix three bugs.
  36. ;;; 1. Function "defined" is just like lookup.
  37. ;;; 2. Skip to newline or cr in case text is hidden.
  38. ;;; 3. Use car of token list if just one symbol.
  39. ;;;
  40. ;;; Revision 1.2  88/01/28  23:32:46  liberte
  41. ;;; Use hide-ifdef-mode-prefix-key.
  42. ;;; Copy current-local-map so other buffers do not get
  43. ;;; hide-ifdef-mode bindings.
  44. ;;;
  45. ;;;--------------------------------------------------------------
  46. ;;; To initialize, toggle the hide-ifdef minor mode with
  47. ;;;
  48. ;;; M-x hide-ifdef-mode
  49. ;;;
  50. ;;; This will set up key bindings and call hide-ifdef-mode-hook if it
  51. ;;; has a value.  To explicitly hide ifdefs using a buffer-local
  52. ;;; define list (default empty), type
  53. ;;;
  54. ;;; M-x hide-ifdefs  or C-c h
  55. ;;;
  56. ;;; Hide-ifdef suppresses the display of code that the preprocessor wouldn't
  57. ;;; pass through.  The support of constant expressions in #if lines is 
  58. ;;; limited to identifiers, parens, and the operators: &&, ||, !, and
  59. ;;; "defined".  Please extend this.
  60. ;;;
  61. ;;; The hidden code is marked by ellipses (...).  Be
  62. ;;; cautious when editing near ellipses, since the hidden text is
  63. ;;; still in the buffer, and you can move the point into it and modify
  64. ;;; text unawares.  If you don't want to see the ellipses, set 
  65. ;;; selective-display-ellipses to nil.  But this can be dangerous.
  66. ;;; You can make your buffer read-only while hide-ifdef-hiding by setting
  67. ;;; hide-ifdef-read-only to a non-nil value.  You can toggle this 
  68. ;;; variable with hide-ifdef-toggle-read-only (C-c C-q).
  69. ;;;
  70. ;;; You can undo the effect of hide-ifdefs by typing
  71. ;;;
  72. ;;; M-x show-ifdefs  or C-c s
  73. ;;;
  74. ;;; Use M-x hide-ifdef-define (C-c d) to define a symbol.
  75. ;;; Use M-x hide-ifdef-undef (C-c u) to undefine a symbol.
  76. ;;;
  77. ;;; If you define or undefine a symbol while hide-ifdef-mode is in effect,
  78. ;;; the display will be updated.  Only the define list for the current
  79. ;;; buffer will be affected.  You can save changes to the local define
  80. ;;; list with hide-ifdef-set-define-alist.  This adds entries 
  81. ;;; to hide-ifdef-define-alist.
  82. ;;;
  83. ;;; If you have defined a hide-ifdef-mode-hook, you can set
  84. ;;; up a list of symbols that may be used by hide-ifdefs as in the
  85. ;;; following example:
  86. ;;;
  87. ;;; (setq hide-ifdef-mode-hook
  88. ;;;      '(lambda ()
  89. ;;;     (if (not hide-ifdef-define-alist)
  90. ;;;         (setq hide-ifdef-define-alist
  91. ;;;          '((list1 ONE TWO)
  92. ;;;            (list2 TWO THREE)
  93. ;;;            )))
  94. ;;;     (hide-ifdef-use-define-alist 'list2) ; use list2 by default
  95. ;;;     ))
  96. ;;;
  97. ;;; You can call hide-ifdef-use-define-alist (C-c u) at any time to specify
  98. ;;; another list to use.
  99. ;;;
  100. ;;; To cause ifdefs to be hidden as soon as hide-ifdef-mode is called,
  101. ;;; set hide-ifdef-initially to non-nil.
  102. ;;;
  103. ;;; If you set hide-ifdef-lines to t, hide-ifdefs hides all the #ifdef lines.
  104. ;;; In the absence of highlighting, that might be a bad idea.  If you set
  105. ;;; hide-ifdef-lines to nil (the default), the surrounding preprocessor
  106. ;;; lines will be displayed.  That can be confusing in its own
  107. ;;; right.  Other variations on display are possible, but not much
  108. ;;; better.
  109. ;;;
  110. ;;; You can explicitly hide or show individual ifdef blocks irrespective
  111. ;;; of the define list by using hide-ifdef-block and show-ifdef-block.
  112. ;;;
  113. ;;; You can move the point between ifdefs with forward-ifdef, backward-ifdef,
  114. ;;; up-ifdef, down-ifdef, next-ifdef, and previous-ifdef.
  115. ;;;
  116. ;;; If you have minor-mode-alist in your mode line (the default) two labels
  117. ;;; may appear.  "Ifdef" will appear when hide-ifdef-mode is active.  "Hiding"
  118. ;;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil).
  119.  
  120.  
  121.  
  122. (defvar hide-ifdef-mode-map nil
  123.   "Keymap used with hide-ifdef mode")
  124.  
  125. (defconst hide-ifdef-mode-prefix-key "\C-c"
  126.   "Prefix key for all hide-ifdef-mode commands.")
  127.  
  128. (defvar hide-ifdef-mode-map-before nil
  129.   "Buffer-local variable to store a copy of the local keymap
  130.     before hide-ifdef-mode modifies it.")
  131.  
  132. (defun define-hide-ifdef-mode-map ()
  133.   (if hide-ifdef-mode-map
  134.       ()                ; dont redefine it.
  135.     (setq hide-ifdef-mode-map (make-sparse-keymap))
  136.     (define-key hide-ifdef-mode-map "d" 'hide-ifdef-define)
  137.     (define-key hide-ifdef-mode-map "u" 'hide-ifdef-undef)
  138.     (define-key hide-ifdef-mode-map "D" 'hide-ifdef-set-define-alist)
  139.     (define-key hide-ifdef-mode-map "U" 'hide-ifdef-use-define-alist)
  140.   
  141.     (define-key hide-ifdef-mode-map "h" 'hide-ifdefs)
  142.     (define-key hide-ifdef-mode-map "s" 'show-ifdefs)
  143.     (define-key hide-ifdef-mode-map "\C-h" 'hide-ifdef-block)
  144.     (define-key hide-ifdef-mode-map "\C-s" 'show-ifdef-block)
  145.   
  146.     (define-key hide-ifdef-mode-map "\C-f" 'forward-ifdef)
  147.     (define-key hide-ifdef-mode-map "\C-b" 'backward-ifdef)
  148.     (define-key hide-ifdef-mode-map "\C-d" 'down-ifdef)
  149.     (define-key hide-ifdef-mode-map "\C-u" 'up-ifdef)
  150.     (define-key hide-ifdef-mode-map "\C-n" 'next-ifdef)
  151.     (define-key hide-ifdef-mode-map "\C-p" 'previous-ifdef)
  152.     (define-key hide-ifdef-mode-map "\C-q" 'hide-ifdef-toggle-read-only)
  153.     (define-key hide-ifdef-mode-map
  154.       (where-is-internal 'toggle-read-only nil t)
  155.       'hide-ifdef-toggle-outside-read-only)
  156.     )
  157.   (fset 'hide-ifdef-mode-map hide-ifdef-mode-map)  ; the function is the map
  158.   )
  159.  
  160. (defun hif-update-mode-line ()
  161.   "Update mode-line by setting buffer-modified to itself."
  162.   (set-buffer-modified-p (buffer-modified-p)))
  163.  
  164.  
  165. (defvar hide-ifdef-mode nil
  166.   "non-nil when hide-ifdef-mode is activated.")
  167.  
  168. (defvar hide-ifdef-hiding nil
  169.   "non-nil when text may be hidden.")
  170.  
  171. (or (assq 'hide-ifdef-hiding minor-mode-alist)
  172.     (setq minor-mode-alist
  173.           (cons '(hide-ifdef-hiding " Hiding")
  174.                 minor-mode-alist)))
  175.  
  176. (or (assq 'hide-ifdef-mode minor-mode-alist)
  177.     (setq minor-mode-alist
  178.           (cons '(hide-ifdef-mode " Ifdef")
  179.                 minor-mode-alist)))
  180.  
  181.  
  182. (defun hide-ifdef-mode (arg)
  183.   "Toggle hide-ifdef-mode.  Thus this is a minor mode, albeit a large one.
  184. With arg, turn hide-ifdef-mode on iff arg is positive.
  185. In hide-ifdef-mode, code within #ifdef constructs that the C preprocessor
  186. would eliminate may be hidden from view.  Several variables affect
  187. how the hiding is done:
  188.  
  189. hide-ifdef-env
  190.     An association list of defined and undefined symbols for the
  191.     current buffer.  Initially, the global value of hide-ifdef-env is used.
  192.  
  193. hide-ifdef-define-alist
  194.     An association list of defined symbol lists.  
  195.         Use hide-ifdef-set-define-alist to save the current hide-ifdef-env
  196.         and hide-ifdef-use-define-alist to set the current hide-ifdef-env
  197.         from one of the lists in hide-ifdef-define-alist.
  198.  
  199. hide-ifdef-lines
  200.     Set to non-nil to not show #if, #ifdef, #ifndef, #else, and
  201.     #endif lines when hiding.
  202.  
  203. hide-ifdef-initially
  204.     Indicates whether hide-ifdefs should be called when hide-ifdef-mode
  205.     is activated.
  206.  
  207. hide-ifdef-read-only
  208.     Set to non-nil if you want to make buffers read only while hiding.
  209.     After show-ifdefs, read-only status is restored to pr